package com.ruoyi.common.utils.tool;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;

public class TimerUtils {

    /**
     * 时间戳转日期 yyyy-MM-dd HH:mm:ss
     *
     * @param timeStamp
     * @return
     */
    public static String timeToDateTime(long timeStamp) {
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(timeStamp);
    }

    /**
     * 时间戳转日期 yyyy-MM-dd HH:mm:ss
     * timeStamp 时间戳
     * dateFormat 时间格式 yyyy-MM-dd HH:mm:ss
     *
     * @param timeStamp
     * @return
     */
    public static String timeToDateFormat(long timeStamp, String dateFormat) {
        return new SimpleDateFormat(dateFormat).format(timeStamp);
    }

    /**
     * 时间戳字符串转日期 yyyy-MM-dd HH:mm:ss
     *
     * @param timeStamp
     * @return
     */
    public static String stringToDateTime(String timeStamp) {
        return timeToDateTime(Long.parseLong(timeStamp));
    }

    /**
     * Date 格式化为日期
     *
     * @param timeStamp
     * @param dateFormat yyyy-MM-dd HH:mm:ss
     * @return
     */
    public static String dateToDateTime(Date timeStamp, String dateFormat) {
        return new SimpleDateFormat(dateFormat).format(timeStamp);
    }

    /**
     * 获取当前时间
     *
     * @return
     */
    public static String getDateTime() {
        return getDateTime("yyyy-MM-dd HH:mm:ss");
    }

    /**
     * 获取当前时间
     *
     * @param dateFormat 可自定义时间格式: yyyy-MM-dd HH:mm:ss
     * @return
     */
    public static String getDateTime(String dateFormat) {
        return new SimpleDateFormat(dateFormat).format(new Date());
    }

    /**
     * 时间 日期字符串转 Date
     *
     * @param timeStamp
     * @param dateFormat
     * @return
     */
    public static Date stringToDate(String timeStamp, String dateFormat) {
        try {
            if (timeStamp == null) return null;
            return new SimpleDateFormat(dateFormat).parse(timeStamp);
        } catch (ParseException e) {
            System.out.println("日期字符串转 Date："+e.getMessage());
        }
        return null;
    }

    /**
     * 时间字符串转时间戳
     *
     * @param timeStamp  : 2018-1-9 12:17:22
     * @param dateFormat ：yyyy-MM-dd HH:mm:ss
     * @return
     * @throws ParseException
     */
    public static Long dateFormatToTime(String timeStamp, String dateFormat) {
        try {
            if (timeStamp == null) return null;
            SimpleDateFormat format = new SimpleDateFormat(dateFormat);
            Date date = format.parse(timeStamp);
            return date.getTime();
        } catch (ParseException e) {
            System.out.println("时间转换错误：" + e.getMessage());
            return null;
        }
    }

    /**
     * 获取当前是星期几
     *
     * @return
     */
    public static String getWeekOfDate() {
        Date currentDate = new Date();
        String[] weekDays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
        Calendar cal = Calendar.getInstance();
        cal.setTime(currentDate);
        int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
        if (w < 0) w = 0;
        return weekDays[w];
    }

    /**
     * 获取当前星期几下标
     *
     * @return
     */
    public static Integer getWeekIndex() {
        Date currentDate = new Date();
        Calendar cal = Calendar.getInstance();
        cal.setTime(currentDate);
        return cal.get(Calendar.DAY_OF_WEEK) - 1;
    }

    /**
     * 获取之前某时间
     * 默认返回字符串格式：yyyy-MM-dd HH:mm:ss
     *
     * @param timeStamp  时间大小
     * @param timeType   时间类型：时 、分 、秒
     * @param dateFormat 返回时间格式：
     * @return
     */
    public static String getBeforeTime(int timeStamp, String timeType, String dateFormat) {

        /* 核心代码 */
        Calendar beforeTime = Calendar.getInstance();
        switch (timeType) {
            case "HOUR":
                beforeTime.add(Calendar.HOUR, -timeStamp);// x小时之前的时间
                break;

            case "MINUTE":
                beforeTime.add(Calendar.MINUTE, -timeStamp);// x分钟之前的时间
                break;

            case "SECOND":
                beforeTime.add(Calendar.SECOND, -timeStamp);// x秒钟之前的时间
                break;

            case "MONTH":
                beforeTime.add(Calendar.MONTH, -timeStamp);// x月之前的时间
                break;

            case "DAY_OF_YEAR":
                beforeTime.add(Calendar.DAY_OF_YEAR, -timeStamp);// x日之前的时间
                break;

            case "WEEK_OF_YEAR":
                beforeTime.add(Calendar.WEEK_OF_YEAR, -timeStamp);// x星期之前的时间
                break;
        }

        // 默认时间格式
        if (dateFormat == "" || dateFormat == null) {
            dateFormat = "yyyy-MM-dd HH:mm:ss";
        }

        Date beforeD = beforeTime.getTime();
        String beforeTimeForma = new SimpleDateFormat(dateFormat).format(beforeD);  // 前五分钟时间
        return beforeTimeForma;
    }

    /**
     * 获取指定时间的前的某个时间
     *
     * @return
     */
    public static String getDateTimeBeforeTime(String dateTime, long timeStamp) throws ParseException {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = dateFormat.parse(dateTime);
        Date beforeTime = new Date(date.getTime() - timeStamp);
        return dateFormat.format(beforeTime);
    }

    /**
     * 获取指定时间的后的某个时间
     *
     * @return
     */
    public static String getDateTimeAfterTime(String dateTime, int timeStamp) throws ParseException {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = dateFormat.parse(dateTime);
        Date afterTime = new Date(date.getTime() + timeStamp);
        return dateFormat.format(afterTime);
    }

    /**
     * 判断当前时间是否大于某个时间
     *
     * @param time yyyy-MM-dd HH:mm:ss
     * @return
     */
    public static boolean dateCompare(String time) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime localTime = LocalDateTime.parse(time, dtf);
        return LocalDateTime.now().isAfter(localTime);
    }

    /**
     * 判断当前时间是否大于某个时点
     *
     * @param time HH:mm:ss
     * @return
     */
    public static boolean timeCompare(String time) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm:ss");
        LocalTime localTime = LocalTime.parse(time, dtf);
        return LocalTime.now().isAfter(localTime);
    }

    /**
     * 判断某时间是否小于当前时间
     *
     * @param time
     * @return
     */
    public static boolean timeIsBeforeNow(String time) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm:ss");
        LocalTime localTime = LocalTime.parse(time, dtf);
        return localTime.isBefore(LocalTime.now());
    }

    /**
     * 判断某时间是否大于当前时间
     *
     * @param time
     * @return
     */
    public static boolean timeIsAfterNow(String time) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm:ss");
        LocalTime localTime = LocalTime.parse(time, dtf);
        return localTime.isAfter(LocalTime.now());
    }

    //判断是否在规定的时间内签到 nowTime 当前时间 beginTime规定开始时间 endTime规定结束时间
    public static boolean timeCalendar(Date nowTime, Date beginTime, Date endTime) {
        //设置当前时间
        Calendar date = Calendar.getInstance();
        date.setTime(nowTime);
        //设置开始时间
        Calendar amBegin = Calendar.getInstance();
        amBegin.setTime(beginTime);//开始时间

        //设置结束时间
        Calendar amEnd = Calendar.getInstance();
        amEnd.setTime(endTime);//结束时间

        //处于开始时间之后，和结束时间之前的判断
        if (date.after(amBegin) && date.before(amEnd)) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 时间 日期字符串转 Calendar
     *
     * @param timeStamp
     * @return Date
     */
    public static Calendar stringToCalendar(String timeStamp) {
        return stringToCalendar(timeStamp, "yyyy-MM-dd HH:mm:ss");
    }

    /**
     * 时间 日期字符串转 Calendar
     *
     * @param timeStamp
     * @param dateFormat
     * @return Date
     */
    public static Calendar stringToCalendar(String timeStamp, String dateFormat) {
        Date date = stringToDate(timeStamp, dateFormat);
        if (date == null) return null;
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar;
    }

    /**
     * 时间转为星期下标
     *  0：星期天 、1：星期一、2：星期二、3：星期三、4：星期四、5：星期五、6：星期六
     *  （注：对标 php的'w' 来获取星期天为0的表示方式）
     * @param timeStamp
     * @return
     */
    public static int dateTimeToWeekIndex(String timeStamp){
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime dateTime = LocalDateTime.parse(timeStamp, formatter);
        // 获取星期的下标（ISO标准：1=星期一，7=星期日）
        int weekIndex = dateTime.getDayOfWeek().getValue();
        if (weekIndex == 7){
            weekIndex = 0;
        }
        // 返回下标
        return weekIndex;
    }
}